package main

import "fmt"

// 定义一个不需要参数也没有返回值的参数：sayHello
func sayHello() {
	fmt.Println("沙河小王子")
}

// 定义一个接收string类型的name参数
func sayHello2(name string) {
	fmt.Println("Hello", name)
}

// 定义接收多个参数的函数并且有一个返回值
func intSum(a int, b int) int {
	ret := a + b
	return ret
}

// 上面和下面写法都可以，如果已经定义好返回值变量ret，那下方就不需要 ：，return 也不需要加ret
func intSum2(a int, b int) (ret int) {
	ret = a + b
	return
}

// 函数接收可变参数，在参数名后面加... 表示可变参数
// 可变参数在函数体内是切片类型
func intSum3(a ...int) int {
	ret := 0
	for _, arg := range a {
		ret = ret + arg
	}
	return ret
}

// 固定参数和可变参数同事出现时，可变参数放在最后
// go语言中没有默认参数
func intSum4(a int, b ...int) int {
	ret := a
	for _, arg := range b {
		ret = ret + arg
	}
	return ret

}

// go语言中参数类型简写
func intSum5(a, b int) (ret int) {
	ret = a + b
	return
}

// 定义具有多个返回值的函数,多返回值也支持类型简写

func calc(a, b int) (sum, sub int) {
	sum = a + b
	sub = a - b
	return
}

func main() {
	sayHello()
	n := "沙河娜扎"
	sayHello2(n)
	sayHello2("沙河娜扎")   // 2个写法都可以
	r := intSum(10, 20) // 调用并接收返回值
	fmt.Println(r)

	r1 := intSum3()
	r2 := intSum3(10)
	r3 := intSum3(10, 20)
	r4 := intSum3(10, 20, 30)
	fmt.Println(r1, r2, r3, r4)

	r11 := intSum4(0)          //a=0,b=[]
	r22 := intSum4(10)         //a=10,b=[]
	r33 := intSum4(10, 20)     //a=10,b=[20]
	r44 := intSum4(10, 20, 30) //a=10,b=[20,30]
	fmt.Println(r11, r22, r33, r44)

	x, y := calc(100, 200)
	fmt.Println(x, y)
}
